package model;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author João Gonçalves
 * @author Eventon Silva
 */
public class Arquivo {

    private static ArrayList<Processo> listaProcessos;

    private static void adicionarProcesso(int dataCriacao, int duracao, int prioridade) {
        // Adiciona o novo processo a lista de processos
        listaProcessos.add(new Processo(dataCriacao, duracao, prioridade));
    }

    /**
     * Método responsável pelo leitura do arquivo do disco e por carregar os
     * dados em um Array em forma de processos.
     *
     * @param arquivo É o arquivo recebido.
     * @return Um lista de processos.
     * @throws FileNotFoundException Erro lançado ao não encontrar o arquivo
     * passado.
     */
    public static ArrayList<Processo> carregarArquivo(String arquivo) throws FileNotFoundException {

        listaProcessos = new ArrayList<>();

        // Leitura e carregamento do arquivo
        FileReader fileReader;
        Scanner scanner;

        fileReader = new FileReader(arquivo);
        scanner = new Scanner(fileReader);

        /*
         * Lendo e registrando cada linha do arquivo em 
         * forma de processo para uma lista de processos.
         */
        while (scanner.hasNextInt()) {

            int dataCriacao = scanner.nextInt();
            int duracao = scanner.nextInt();
            int prioridade = scanner.nextInt();

            // Adiciona o novo processo a lista de processos
            adicionarProcesso(dataCriacao, duracao, prioridade);
        }

        /*
         * Fechando recursos para enconomizar memória.
         */
        scanner.close();
        try {
            fileReader.close();
        } catch (IOException ex) {
            Logger.getLogger(Arquivo.class.getName()).log(Level.SEVERE, null, ex);
        }

        /**
         * Ordenação da lista de processos de acordo com o data(tempo) de
         * criação do processo. Evitando que haja erros na sequencia de execução
         * dos processos.
         */
        Collections.sort(listaProcessos);

        return listaProcessos;
    }
}